/*
 * Copyright (c) 2005, The haXe Project Contributors
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */
package js;

import js.Dom;

class Lib {

	public static var isIE : Bool;
	public static var isOpera : Bool;
	#if !asc
	public static var document : Document;
	public static var window : Window;
	#else
	public static var application : asc.Application;
	#end
	static var onerror : String -> Array<String> -> Bool = null;

	public static function alert( v : Dynamic ) {
		untyped __js__("alert")(js.Boot.__string_rec(v,""));
	}

	public static function eval( code : String ) : Dynamic {
		return untyped __js__("eval")(code);
	}

	public static function setErrorHandler( f ) {
		onerror = f;
	}

	static function __init__() untyped
	{
		#if asc
		document = untyped __js__("{}");
		window = untyped __js__("{}");
		application = untyped __js__("application");
		#else
		document = untyped __js__("document");
		window = untyped __js__("window");
		#end
		#if debug
__js__('onerror = function(msg,url,line) {
		var stack = $s.copy();
		var f = js.Lib.onerror;
		$s.splice(0,$s.length);
		if( f == null ) {
			var i = stack.length;
			var s = "";
			while( --i >= 0 )
				s += "Called from "+stack[i]+"\\n";
			alert(msg+"\\n\\n"+s);
			return false;
		}
		return f(msg,stack);
	}');
		#else
__js__('onerror = function(msg,url,line) {
		var f = js.Lib.onerror;
		if( f == null )
			return false;
		return f(msg,[url+":"+line]);
	}');
		#end
	}
	
	#if asc
	public static inline function load(str:String):Void untyped
	{
		__js__("load")(str);
	}
	
	/**
	 * Protects the methods of an object from application code. Application code cannot access
	 * or inspect the methods directly. You can use this function only in the secure.asc file.
	 * @param	obj		An object to protect. 
	 * @return	An Object.
	 */
	public static inline function protectObject(obj:Dynamic):Dynamic untyped
	{
		return __js__("protectObject")(obj);
	}
	
	/**
	 * Prevents certain methods and properties from being enumerated, written, and deleted.
	 * In a server-side script, all properties in an object are enumerable, writable, and
	 * deletable by default. Call setAttributes() to change the default attributes of a property
	 * or to define constants. 
	 * 
	 * @param	object		An Object.
	 * @param	propName	A string indicating the name of the property in the object parameter.
	 * 						Setting attributes on nonexistent properties has no effect.
	 * @param	enumerable	Makes a property enumerable if true or nonenumerable if false;
	 * @param	readonly	Makes a property read-only if true or writable if false;
	 * @param	permanent	Makes a property permanent (nondeletable) if true or deletable if false;
	 */
	public static inline function setAttributes(object:Dynamic, propName:String, enumerable:Bool, readonly:Bool, permanent:Bool):Void untyped
	{
		__js__("setAttributes")(object, propName, enumerable, readonly, permanent);
	}
	
	public static inline function getGlobal():Dynamic untyped
	{
		return __js__("getGlobal()");
	}
	
	public static inline function trace(dyn:Dynamic):Void untyped
	{
		__js__("trace")(Std.string(dyn));
	}
	
	#end

}
